/**
 * 错误处理工具类
 */
export default {
  /**
   * 处理API错误
   * @param {Error} error - 错误对象
   * @param {Object} context - 上下文对象，包含Vue实例等
   * @returns {string} 错误消息
   */
  handleApiError(error, context = {}) {
    if (!error) {
      return '未知错误'
    }

    let errorMessage = '请求失败，请稍后重试'

    // 处理Axios错误
    if (error.response) {
      // 服务器响应了，但状态码不在 2xx 范围内
      const { status, data } = error.response
      
      switch (status) {
        case 400:
          errorMessage = data.message || '请求参数错误'
          break
        case 401:
          errorMessage = '未授权，请重新登录'
          // 可以在这里处理登录跳转
          if (context.$router) {
            setTimeout(() => {
              context.$router.push('/login')
            }, 1500)
          }
          break
        case 403:
          errorMessage = '拒绝访问，权限不足'
          break
        case 404:
          errorMessage = '请求的资源不存在'
          break
        case 408:
          errorMessage = '请求超时'
          break
        case 413:
          errorMessage = '请求数据过大，请减小文件大小'
          break
        case 500:
          errorMessage = data.message || '服务器内部错误'
          break
        case 502:
          errorMessage = '网关错误'
          break
        case 503:
          errorMessage = '服务暂时不可用，请稍后重试'
          break
        case 504:
          errorMessage = '网关超时'
          break
        default:
          errorMessage = data.message || `请求失败 (${status})`
      }
    } else if (error.request) {
      // 请求已发出，但没有收到响应
      errorMessage = '网络错误，请检查您的网络连接'
    } else if (error.message) {
      // 其他错误信息
      errorMessage = error.message
    }

    // 显示错误消息
    if (context.$message) {
      context.$message.error(errorMessage)
    } else {
      console.error(errorMessage)
    }

    return errorMessage
  },

  /**
   * 处理表单验证错误
   * @param {Object} errors - 表单验证错误对象
   * @param {Object} context - 上下文对象
   */
  handleValidationError(errors, context = {}) {
    if (!errors || typeof errors !== 'object') return

    // 提取第一个错误信息
    for (const key in errors) {
      if (errors[key] && errors[key].length > 0) {
        const errorMessage = errors[key][0]
        if (context.$message) {
          context.$message.error(errorMessage)
        } else {
          console.error(errorMessage)
        }
        return
      }
    }

    // 如果没有具体错误字段，显示通用消息
    if (context.$message) {
      context.$message.error('表单验证失败，请检查输入')
    }
  },

  /**
   * 记录错误日志
   * @param {Error} error - 错误对象
   * @param {string} message - 自定义错误消息
   */
  logError(error, message = '发生错误') {
    console.error(message, error)
    
    // 在实际项目中，可以将错误日志发送到服务器
    // 这里仅作为示例，实际项目中需要实现错误日志上报功能
    if (window.console && window.console.error) {
      // 构建错误信息
      const errorInfo = {
        message,
        timestamp: new Date().toISOString(),
        error: {
          message: error.message,
          stack: error.stack,
          name: error.name
        },
        location: window.location.href
      }
      
      // 仅在开发环境打印完整错误信息
      if (process.env.NODE_ENV === 'development') {
        console.error('详细错误信息:', errorInfo)
      }
    }
  },

  /**
   * 安全地尝试执行可能出错的函数
   * @param {Function} fn - 要尝试执行的函数
   * @param {Object} options - 配置选项
   * @param {*} options.defaultValue - 出错时的默认返回值
   * @param {Function} options.onError - 出错时的回调函数
   * @returns {*} 函数执行结果或默认值
   */
  safeTry(fn, options = {}) {
    const { defaultValue = null, onError } = options
    
    try {
      return fn()
    } catch (error) {
      if (typeof onError === 'function') {
        onError(error)
      } else {
        this.logError(error, '安全尝试执行失败')
      }
      return defaultValue
    }
  }
}

/**
 * 网络状态检测
 */
export const networkUtils = {
  /**
   * 检查网络连接状态
   * @returns {boolean} 是否在线
   */
  isOnline() {
    return window.navigator.onLine
  },

  /**
   * 添加网络状态变化监听
   * @param {Function} onlineCallback - 网络连接时的回调
   * @param {Function} offlineCallback - 网络断开时的回调
   */
  addNetworkListeners(onlineCallback, offlineCallback) {
    window.addEventListener('online', onlineCallback)
    window.addEventListener('offline', offlineCallback)
    
    // 返回清理函数
    return () => {
      window.removeEventListener('online', onlineCallback)
      window.removeEventListener('offline', offlineCallback)
    }
  }
}